/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package desarrollosoft.ghce.vista.implementaciones;

import desarrollosoft.ghce.entidades.Plantilla;
import desarrollosoft.ghce.entidades.PlantillaEstudioImagenes;
import desarrollosoft.ghce.entidades.PlantillaEstudioLaboratorio;
import desarrollosoft.ghce.servicio.interfaces.IParserExcepciones;
import desarrollosoft.ghce.servicio.interfaces.IServicioHistorial;
import desarrollosoft.ghce.servicio.interfaces.IServicioPlantillas;
import desarrollosoft.ghce.vista.interfaces.Estado;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

/**
 *
 * @author ariel
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ControladoraAdministracionPlantillasEstudios extends SelectorComposer<Window> {

    @WireVariable("servicioHistorial")
    private IServicioHistorial servicioHistorial;

    @WireVariable("servicioPlantillas")
    private IServicioPlantillas servicioPlantillas;

    @WireVariable("parserExcepcionesPlantillas")
    private IParserExcepciones parserExcepciones;
    
    private Estado estado;

    private Window ventanaAnterior;

    private List<String> listaTiposEstudios;

    @Wire
    private Textbox textboxNombre;

    @Wire
    private Combobox comboboxTiposEstudios;

    @Wire
    private Button botonBuscar;

    @Wire
    private Button botonCrear;

    @Wire
    private Listbox listboxPlantillas;

    @Wire
    private Button botonModificar;

    @Wire
    private Button botonEliminar;

    @Wire
    private Textbox textboxDetalleNombrePlantilla;
    
    @Wire
    private Button botonGuardar;

    @Wire
    private Button botonCancelar;

    @Wire
    private Window ventanaDetalles;

    @Override
    public void doAfterCompose(Window comp) throws Exception {
        hacerAntesDeDibujar();
        super.doAfterCompose(comp);
        hacerDespuesDeDibujar();
    }

    public void hacerAntesDeDibujar() {

    }

    public void hacerDespuesDeDibujar() {
        listboxPlantillas.setModel(new ListModelList<>(servicioHistorial.traerTodasPlantillas()));
        listaTiposEstudios = servicioHistorial.obtenerTodosTiposEstudios();
        comboboxTiposEstudios.setModel(new ListModelList<>(listaTiposEstudios));
        setearEstadoBotones(Estado.BUSCANDO);
    }

    private void setearEstadoBotones(Estado estado) {
        this.estado = estado;
        if (estado.equals(Estado.BUSCANDO)) {
            setearHabilitadosBotonesBuscarCrear(true);
            setearHabilitadosBotonesModificarEliminar(true);
            setearHabilitadosBotonesGuardarCancelar(false);
            limpiarCampos();
        } else if (estado.equals(Estado.CREANDO)) {
            limpiarCampos();
            setearHabilitadosBotonesBuscarCrear(false);
            setearHabilitadosBotonesModificarEliminar(false);
            setearHabilitadosBotonesGuardarCancelar(true);
        } else if (estado.equals(Estado.MODIFICANDO)) {
            setearHabilitadosBotonesBuscarCrear(false);
            setearHabilitadosBotonesModificarEliminar(false);
            setearHabilitadosBotonesGuardarCancelar(true);
        }
    }

    private void setearHabilitadosBotonesBuscarCrear(boolean valor) {
        botonBuscar.setDisabled(!valor);
        botonCrear.setDisabled(!valor);
    }

    private void setearHabilitadosBotonesModificarEliminar(boolean valor) {
        botonModificar.setDisabled(!valor);
        botonEliminar.setDisabled(!valor);
    }

    private void setearHabilitadosBotonesGuardarCancelar(boolean valor) {
        botonGuardar.setDisabled(!valor);
        botonCancelar.setDisabled(!valor);
        
        textboxDetalleNombrePlantilla.setReadonly(!valor);
        comboboxTiposEstudios.setReadonly(!valor);
        comboboxTiposEstudios.setButtonVisible(valor);
    }

    private void limpiarCampos() {
        textboxDetalleNombrePlantilla.setValue("");
        comboboxTiposEstudios.setSelectedIndex(-1);
        mostrarDetalles(null, false);
    }

    @Listen("onClick = #botonBuscar")
    public void clickBotonBuscar() {
        String textoBuscar = textboxNombre.getValue();
        if (textoBuscar.isEmpty()) {
            listboxPlantillas.setModel(new ListModelList<>(servicioHistorial.traerTodasPlantillas()));
        } else {
            listboxPlantillas.setModel(new ListModelList<>(servicioHistorial.traerTodasPlantillas(textoBuscar)));
        }
        mostrarDetalles(null, false);
    }

    @Listen("onClick = #botonCrear")
    public void clickBotonCrear() {
        setearEstadoBotones(Estado.CREANDO);
        textboxDetalleNombrePlantilla.setValue("");
        comboboxTiposEstudios.setSelectedIndex(-1);
        mostrarDetalles(null, false);
    }

    @Listen("onClick = #botonModificar")
    public void clickBotonModificar() {
        Listitem itemSeleccionado = listboxPlantillas.getSelectedItem();
        Plantilla plantillaSeleccionada = itemSeleccionado.getValue();
        textboxDetalleNombrePlantilla.setValue(plantillaSeleccionada.getNombre());
        comboboxTiposEstudios.setSelectedIndex(listaTiposEstudios.indexOf(plantillaSeleccionada.getTipo()));
        
        if (plantillaSeleccionada instanceof PlantillaEstudioImagenes) {
            mostrarDetalles(plantillaSeleccionada, true);
        }
        
        setearEstadoBotones(Estado.MODIFICANDO);
    }

    @Listen("onClick = #botonEliminar")
    public void clickBotonEliminar() {
        Listitem itemSeleccionado = listboxPlantillas.getSelectedItem();
        if (itemSeleccionado != null) {
            final Plantilla plantillaSeleccionada = itemSeleccionado.getValue();
            if (plantillaSeleccionada != null) {
                Messagebox.show("¿Confirma que desea eliminar la plantilla seleccionada?", "Confirme por favor",
                        Messagebox.YES | Messagebox.NO, Messagebox.QUESTION,
                        new EventListener() {
                            @Override
                            public void onEvent(Event evt) throws InterruptedException {
                                if (evt.getName().equals("onYes")) { // si confirma
                                    if (plantillaSeleccionada instanceof PlantillaEstudioLaboratorio) {
                                        try {
                                            servicioPlantillas.eliminarPlantillaLaboratorio((PlantillaEstudioLaboratorio) plantillaSeleccionada);
                                        } catch (Exception ex) {
                                            Messagebox.show(parserExcepciones.parsear( ex.toString() ));
                                            return; // ??
                                        }
                                    } else if (plantillaSeleccionada instanceof PlantillaEstudioImagenes) {
                                        try {
                                            servicioPlantillas.eliminarPlantillaImaginologia((PlantillaEstudioImagenes) plantillaSeleccionada);
                                        } catch (Exception ex) {
                                            Messagebox.show(parserExcepciones.parsear( ex.toString() ));
                                            return; // ??
                                        }
                                    }
                                    clickBotonBuscar(); // hago como que buscaron para actualizar la tabla
                                }
                            }
                        }
                );
            }
        }
    }

    @Listen("onClick = #botonGuardar")
    public void clickBotonGuardar() {
        if (estado.equals(Estado.CREANDO)) {
            int indiceSeleccionado = comboboxTiposEstudios.getSelectedIndex();
            if (indiceSeleccionado < 0) {
                Messagebox.show("Seleccione un tipo de Estudio para crearlo");
                return;
            }
            String tipoSeleccionado = listaTiposEstudios.get(indiceSeleccionado);
            switch (tipoSeleccionado) {
                case "Estudio Laboratorio":
                    PlantillaEstudioLaboratorio plantillaEstudioLaboratorio = new PlantillaEstudioLaboratorio();
                    plantillaEstudioLaboratorio.setNombre(textboxDetalleNombrePlantilla.getValue());
                    try {
                        servicioPlantillas.crearPlantillaLaboratorio(plantillaEstudioLaboratorio);
                        clickBotonBuscar();
                        setearEstadoBotones(Estado.BUSCANDO); // CORRECCION!!!
                    } catch (Exception e) {
                        Messagebox.show(parserExcepciones.parsear( e.toString() ));
                    }
                    break;
                case "Estudio Imaginologia":
                    PlantillaEstudioImagenes plantillaEstudioImagenes = new PlantillaEstudioImagenes();
                    plantillaEstudioImagenes.setNombre(textboxDetalleNombrePlantilla.getValue());
                    plantillaEstudioImagenes.setCantidadMinimaImagenes(1);
                    try {
                        servicioPlantillas.crearPlantillaImagenes(plantillaEstudioImagenes);
                        clickBotonBuscar();
                        setearEstadoBotones(Estado.BUSCANDO); // CORRECCION!!!
                    } catch (Exception e) {
                        Messagebox.show(parserExcepciones.parsear( e.toString() ));
                    }
                    break;
            }
        } else if (estado.equals(Estado.MODIFICANDO)) {
            int indiceSeleccionado = comboboxTiposEstudios.getSelectedIndex();
            if (indiceSeleccionado < 0) {
                Messagebox.show("Seleccione un tipo de Estudio");
                return;
            }
            String tipoSeleccionado = listaTiposEstudios.get(indiceSeleccionado);
            Plantilla plantillaSeleccionada = listboxPlantillas.getSelectedItem().getValue();
            if (plantillaSeleccionada instanceof PlantillaEstudioLaboratorio) {
                if (!tipoSeleccionado.equals("Estudio Laboratorio")) {
                    Messagebox.show("Para cambiar el tipo, elimine el estudio y vuelva a crearlo con el nuevo tipo");
                    return;
                }
            } else if (plantillaSeleccionada instanceof PlantillaEstudioImagenes) {
                if (!tipoSeleccionado.equals("Estudio Imaginologia")) {
                    Messagebox.show("Para cambiar el tipo, elimine el estudio y vuelva a crearlo con el nuevo tipo");
                    return;
                }
            }
            /* PROCEDO A MODIFICAR */
            plantillaSeleccionada.setNombre(textboxDetalleNombrePlantilla.getValue()); // seteo el nombre
            if (plantillaSeleccionada instanceof PlantillaEstudioLaboratorio) {
                try {
                    servicioPlantillas.modificarPlantillaLaboratorio((PlantillaEstudioLaboratorio) plantillaSeleccionada);
                    clickBotonBuscar();
                    setearEstadoBotones(Estado.BUSCANDO); // CORRECCION!!!
                } catch (Exception ex) {
                    Messagebox.show(parserExcepciones.parsear( ex.toString() ));
                    return; //??
                }
            } else if (plantillaSeleccionada instanceof PlantillaEstudioImagenes) {
                try {
                    servicioPlantillas.modificarPlantillaImaginologia((PlantillaEstudioImagenes) plantillaSeleccionada);
                    clickBotonBuscar();
                    setearEstadoBotones(Estado.BUSCANDO); // CORRECCION!!!
                } catch (Exception ex) {
                    Messagebox.show(parserExcepciones.parsear( ex.toString() ));
                    return; //??
                }
            }
        }
    }

    @Listen("onClick = #botonCancelar")
    public void clickBotonCancelar() {
        setearEstadoBotones(Estado.BUSCANDO);
    }

    @Listen("onSelect = #listboxPlantillas; onFocus = #listboxPlantillas")
    public void seleccionaronPlantilla() {
        if (!estado.equals(Estado.BUSCANDO)) { // GUARDA
            setearEstadoBotones(Estado.BUSCANDO);
        }
        Listitem itemSeleccionado = listboxPlantillas.getSelectedItem();
        if (itemSeleccionado != null) {
            Plantilla plantillaSeleccionada = itemSeleccionado.getValue();
            if (plantillaSeleccionada != null) {
                mostrarDetallesPlantilla(plantillaSeleccionada);
                mostrarDetalles(plantillaSeleccionada, false);
            }
        }
    }

    private void mostrarDetallesPlantilla(Plantilla plantilla) {
        textboxDetalleNombrePlantilla.setValue(plantilla.getNombre());
        comboboxTiposEstudios.setSelectedIndex(listaTiposEstudios.indexOf(plantilla.getTipo()));
    }
    
    private void mostrarDetalles(Plantilla plantilla, Boolean editable) {
        if (ventanaAnterior != null) {
            ventanaDetalles.removeChild(ventanaAnterior);
            ventanaAnterior = null;
        }
        if (plantilla == null) { // para bancar argumento en null
            return;
        }
        Map<String, Object> argumentos = new HashMap<>();
        if (plantilla instanceof PlantillaEstudioLaboratorio) {
            argumentos.put("plantillaEstudioLaboratorio", (PlantillaEstudioLaboratorio) plantilla);
            ventanaAnterior = (Window) Executions.createComponents("VentanaDetallesPlantillaEstudioLaboratorio.zul", null, argumentos);
        } else if (plantilla instanceof PlantillaEstudioImagenes) { // sino, si es de imaginologia
            argumentos.put("plantillaEstudioImagenes", (PlantillaEstudioImagenes) plantilla);
            argumentos.put("editable", editable);
            ventanaAnterior = (Window) Executions.createComponents("VentanaDetallesPlantillaEstudioImagenes.zul", null, argumentos);
        }
        if (ventanaAnterior != null) {
            ventanaDetalles.appendChild(ventanaAnterior);
        }
    }
}
